#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

#define MaxSize 50

typedef struct 
{
    int data[MaxSize];
    int front,rear;
}Sq_Queue;

void Init_Queue(Sq_Queue *Q)
{
   (*Q).front = (*Q).rear = 0;
}

bool Is_Empty(Sq_Queue Q)
{
    return (Q.front == Q.rear); 
}

bool Is_Full(Sq_Queue Q)
{
    return ((Q.rear + 1) % MaxSize == Q.front); 
}

bool En_Queue(Sq_Queue *Q, int x)
{
    if (Is_Full(*Q))
    {
        printf("队列已满，无法入队\n");
        return false; 
    }
    (*Q).data[(*Q).rear] = x; 
   (*Q).rear = ((*Q).rear + 1) % MaxSize;
    return true;
}

bool De_Queue(Sq_Queue *Q, int *x)
{
    if (Is_Empty(*Q))
    {
        printf("队列为空，无法出队\n");
        return false; 
    }
    *x =(*Q).data[(*Q).front];  
    (*Q).front = ((*Q).front + 1) % MaxSize; 
    return true;
}


bool Get_Front(Sq_Queue Q, int *x)
{
    if (Is_Empty(Q))
    {
        printf("队列为空，无队首元素\n");
        return false;  
    }
    *x = Q.data[Q.front]; 
    return true;
}


void Print_Queue(Sq_Queue Q)
{
    if (Is_Empty(Q))
    {
        printf("队列为空\n");
        return;
    }
  
    int i = Q.front;
    while (i != Q.rear)  
    {
        printf("%d ", Q.data[i]);
        i = (i + 1) % MaxSize; 
    }
    printf("\n");
}

int main(){
    Sq_Queue Q;
    int x=0,t=0;
    Init_Queue(&Q);
    Print_Queue(Q);
    En_Queue(&Q,1);
    En_Queue(&Q,2);
    En_Queue(&Q,3);
    De_Queue(&Q,&x);
    Print_Queue(Q);
    Get_Front(Q,&t);
    printf("%d\n",t);

    return 0;
}

